co-occurrence matrix

AI
gemma-4-31b
작성자
익명
작성일
2026.08.03
조회수
2
버전
v1

공출현 행렬 (Co-occurrence Matrix)

1. 개요

공출현 행렬(Co-occurrence Matrix)란 텍스트 데이터 내에서 두 단어가 특정 거리(윈도우) 내에 동시에 등장하는 빈도를 계산하여 행렬 형태로 나타낸 통계적 모델이다. 이는 자연어 처리(NLP)에서 단어의 분포 가설(Distributional Hypothesis, "비슷한 문맥에서 나타나는 단어들은 비슷한 의미를 가진다")을 기반으로 단어 간의 의미적 유사성을 수치화하는 가장 기초적인 방법론이다.

2. 작동 원리 및 생성 과정

공출현 행렬을 생성하기 위해서는 먼저 분석 대상이 되는 말뭉치(Corpus)를 토큰화하고, 윈도우 크기(Window Size)를 설정해야 한다. 윈도우 크기란 중심 단어를 기준으로 좌우 몇 개의 단어까지를 '함께 등장했다'고 간주할 것인지를 결정하는 범위이다.

생성 단계 예시

  • 대상 문장: "나는 사과를 좋아한다. 나는 바나나를 좋아한다."
  • 전처리: [나, 사과, 좋아, 나, 바나나, 좋아] (조사 제거 및 토큰화)
  • 윈도우 크기: 1 (중심 단어 기준 좌우 1단어)
단계 처리 과정 상세 내용
1단계: 토큰화 텍스트 분리 ['나', '사과', '좋아', '나', '바나나', '좋아']
2단계: 윈도우 적용 슬라이딩 윈도우 (나, 사과), (사과, 나), (사과, 좋아), (좋아, 사과), (좋아, 나) ...
3단계: 빈도 계산 쌍(Pair) 카운팅 '나'와 '사과'가 1번, '나'와 '바나나'가 1번, '좋아'와 '사과'가 1번 등
4단계: 행렬 구성 좌표 매핑 단어 집합 $\{나, 사과, 좋아, 바나나\}$를 축으로 빈도 기입

최종 결과 행렬 (윈도우 크기 1 기준):

사과 좋아 바나나
0 1 0 1
사과 1 0 1 0
좋아 1 1 0 1
바나나 1 0 1 0

윈도우 크기에 따른 결과 차이

윈도우 크기는 추출되는 의미적 관계의 성격에 영향을 미친다.

윈도우 크기 특징 포착되는 관계 예시
작은 윈도우 (1~2) 국소적 문맥 강조 구문적/기능적 관계 (품사, 직접적 수식) '사과' $\rightarrow$ '빨간' (형용사-명사)
큰 윈도우 (5~10) 전역적 문맥 강조 주제적/의미적 관계 (토픽, 도메인) '사과' $\rightarrow$ '비타민', '과일' (상위 개념)

3. 수학적 표현 및 특성

공출현 행렬 $M$의 차원은 $V \times V$이다. 여기서 $V$는 말뭉치에 등장하는 고유 단어의 수(Vocabulary Size)를 의미한다.

주요 특성

  1. 희소 행렬 (Sparse Matrix): 대부분의 단어 쌍은 함께 등장하지 않으므로, 행렬의 대부분의 원소가 0으로 채워진다. 이는 메모리 낭비와 계산 효율성 저하를 야기하며, 이를 해결하기 위해 SVD와 같은 차원 축소 기법이나 밀집 벡터 기반의 단어 임베딩(Word Embedding) 기법이 사용된다.
  2. 대칭 행렬 (Symmetric Matrix): 단어 A가 B와 공출현했다면 B 역시 A와 공출현한 것이므로, $M_{ij} = M_{ji}$ 성질을 갖는다. 이는 윈도우 내의 모든 단어를 동일하게 카운트하는 무방향성(Undirected) 설정일 때 성립하며, 방향성 윈도우를 설정할 경우 대칭이 아닐 수 있다.

Python 구현 예제

# 설치: pip install numpy
import numpy as np
from collections import defaultdict

def build_co_occurrence_matrix(corpus, window_size=1):
    vocab = sorted(list(set(corpus)))
    word_to_idx = {word: i for i, word in enumerate(vocab)}
    v_size = len(vocab)
    matrix = np.zeros((v_size, v_size), dtype=int)

    for i in range(len(corpus)):
        center_word = corpus[i]
        # 윈도우 범위 설정
        start = max(0, i - window_size)
        end = min(len(corpus), i + window_size + 1)
        
        for j in range(start, end):
            if i == j: continue
            target_word = corpus[j]
            matrix[word_to_idx[center_word], word_to_idx[target_word]] += 1
            
    return matrix, vocab

# 실행 예시
text = ["나", "사과", "좋아", "나", "바나나", "좋아"]
matrix, vocab = build_co_occurrence_matrix(text, window_size=1)
print(matrix)

4. 한계점 및 개선 방안

단순 빈도 기반의 공출현 행렬은 심각한 통계적 왜곡을 포함한다.

한계점

  • 고빈도 단어의 지배: '그', '이', '것'과 같은 불용어(Stopwords)는 거의 모든 단어와 함께 등장하므로 빈도수가 매우 높게 측정되어, 실제 의미적 연관성이 없음에도 유사도가 높게 나오는 문제가 발생한다.
  • 차원의 저주 (Curse of Dimensionality): 단어 집합 $V$가 커질수록 행렬의 크기가 제곱으로 증가하여 연산 비용이 기하급수적으로 상승한다.

가중치 적용 방식 비교

단순 빈도를 보완하기 위해 PMI(Pointwise Mutual Information) 등의 지표를 사용한다.

방식 계산 원리 장점 단점
단순 빈도 (Raw Count) $\text{count}(w_i, w_j)$ 계산이 매우 단순함 불용어의 영향력이 너무 큼
PMI $\log \frac{P(w_i, w_j)}{P(w_i)P(w_j)}$ 우연히 같이 나올 확률을 배제하여 의미적 연관성 강화 저빈도 단어 쌍의 값이 과하게 높게 측정될 수 있음
  • PMI 수식 정의:
    • $P(w_i, w_j)$: 단어 $w_i$와 $w_j$가 동시에 등장할 결합 확률 (Joint Probability)
    • $P(w_i), P(w_j)$: 각 단어가 개별적으로 등장할 확률 (Marginal Probability)

5. SVD를 이용한 차원 축소

공출현 행렬의 희소성과 고차원 문제를 해결하기 위해 특이값 분해(SVD, Singular Value Decomposition)를 적용한다.

SVD는 행렬 $M$을 세 개의 행렬의 곱 $M = U\Sigma V^T$로 분해하는 기법이다. 여기서 $\Sigma$는 특이값(Singular Value)을 가진 대각행렬이며, 상위 $k$개의 특이값만을 남기고 나머지를 제거함으로써 데이터를 저차원 공간으로 투영한다.

  • 효과:
    • 노이즈 제거: 중요도가 낮은 작은 특이값을 제거함으로써 데이터의 잡음을 줄인다.
    • 밀집 벡터화: 희소 행렬을 작은 크기의 밀집 벡터(Dense Vector)로 변환하여 계산 효율성을 높인다.
    • 잠재 의미 분석(LSA): 공출현 행렬(또는 TF-IDF 행렬)에 SVD를 적용한 결과물이 바로 LSA(Latent Semantic Analysis)이며, 이를 통해 단순 단어 일치가 아닌 잠재적인 의미 공간(Latent Semantic Space)에서의 유사도를 측정할 수 있게 된다.

6. 활용 및 발전

실제 적용 사례

  • 추천 시스템: 사용자-아이템 공출현 행렬을 통해 특정 상품을 구매한 사용자가 함께 구매할 가능성이 높은 다른 상품을 추천하는 협업 필터링(Collaborative Filtering)의 기초가 된다.
  • 키워드 추출: 문서 내 단어 간 공출현 빈도를 분석하여 핵심 키워드 간의 네트워크 맵을 시각화하는 데 사용된다.
  • 초기 검색 엔진: 단어 간의 연관성을 파악하여 쿼리와 문서 간의 의미적 유사도를 계산하는 초기 형태의 정보 검색 모델에 활용되었다.

단어 임베딩으로의 발전

공출현 행렬은 현대적인 단어 임베딩 기술의 이론적 토대가 되었다. 1. GloVe (Global Vectors for Word Representation): 공출현 행렬의 전역 통계 정보와 Word2Vec의 지역적 문맥 정보를 결합하여, 공출현 확률의 비율을 최적화하는 방식으로 학습한다. 2. Word2Vec: 행렬을 직접 생성하는 대신, 신경망(Skip-gram, CBOW)을 통해 윈도우 내 단어를 예측하도록 학습함으로써 암묵적으로 공출현 정보를 밀집 벡터에 압축하여 저장한다.

AI 생성 콘텐츠 안내

이 문서는 AI 모델(gemma-4-31b)에 의해 생성된 콘텐츠입니다.

주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.

이 AI 생성 콘텐츠가 도움이 되었나요?